/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package funciones;

/**
 *
 * @author Jesus Ruiz Oliva
 */
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.imageio.ImageIO;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;



public class RecibirMail
{
    // Atributos de configuracion de acceso al servidor mail
    private Properties prop;
    private Session sesion;
    private Store store;
    private Folder folder;
    private String hostIMAP;
    private String user;
    private String password;
    
    // Atributos para la gestion de mensajes
    private int numMailVisualizar;
    private int numPagina;
    private int numMailServidor;
    private String[] cabecerasMail;
    //private String[] contenidosMail;
    private Boolean[] leidos;
    
    public RecibirMail(){
        //POP3 no lee bien todos los mensajes, así que obtamos por imap
        prop = new Properties();
        prop.setProperty("mail.imap.starttls.enable", "false");
        prop.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        prop.setProperty("mail.imap.socketFactory.fallback", "false");
        prop.setProperty("mail.imap.port", "995");
        prop.setProperty("mail.imap.socketFactory.port", "995");
        sesion = Session.getInstance(prop);
        hostIMAP = "imap.gmail.com";
        numMailVisualizar = 7;
        numPagina = 0;
        user = "inftel2011@gmail.com";
        password = "fofito2011";        
    }
    // Este deberia ser el constructor que habria que llamar. Pero como 
    // solo disponemos de una cuenta de correos, no se usara.
    public RecibirMail(String mail,String pass){
        prop = new Properties();
        prop.setProperty("mail.imap.starttls.enable", "false");
        prop.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        prop.setProperty("mail.imap.socketFactory.fallback", "false");
        prop.setProperty("mail.imap.port", "995");
        prop.setProperty("mail.imap.socketFactory.port", "995");
        sesion = Session.getInstance(prop);
        hostIMAP ="imap.gmail.com";
        numMailVisualizar = 7;
        numPagina = 0;
        user = mail;
        password = pass;        
    }
    
    public void abrirConexionOnlyRead() throws MessagingException{
        // Se obtiene el Store y el Folder, para poder leer el correo.
        // Nota: Por usar cuenta gmail hay que poner imaps en vez de imap. Solucion propuesta en api de javamail.
        store = sesion.getStore("imaps");                                                   
        store.connect(hostIMAP,user,password);
        folder = store.getFolder("INBOX");
        //Si lo tengo como READ_ONLY no cambiara el estado de no leido a leido
        folder.open(Folder.READ_ONLY);
    }
    public void abrirConexion() throws MessagingException{
        // Se obtiene el Store y el Folder, para poder leer el correo.
        // Nota: Por usar cuenta gmail hay que poner imaps en vez de imap. Solucion propuesta en api de javamail.
        store = sesion.getStore("imaps");                                                   
        store.connect(hostIMAP,user,password);
        folder = store.getFolder("INBOX");
        //Si lo tengo como READ_ONLY no cambiara el estado de no leido a leido
        folder.open(Folder.READ_WRITE);
    }
    public void cerrarConexion() throws MessagingException{
        folder.close(false);
        store.close();
    }
    public int getMessageCount() throws MessagingException{
        int numMensajes=0;
        numMensajes = folder.getMessageCount();
        return numMensajes;
    }
    private void descargarMensajes() throws MessagingException, IOException{    
        numMailServidor = getMessageCount();       
        int fin = numMailServidor - (numPagina)*numMailVisualizar;        
        int inicio = fin - numMailVisualizar+1;  
        if(inicio <1) inicio=1;
        if(fin < 1) fin = 1;
        // Se obtienen los mensajes.
        Message[] mensajes = folder.getMessages(inicio,fin);
        
        cabecerasMail=new String[mensajes.length];
        leidos = new Boolean[mensajes.length];
        //contenidosMail = new String[mensajes.length];
        
        for (int i =0; i < mensajes.length; i++)
        {
            //Puede contener varias direcciones, asi que escogemos la primera
            cabecerasMail[mensajes.length -1 - i]= "FROM: " + mensajes[i].getFrom()[0].toString() + "   SUBJECT: " + mensajes[i].getSubject();
            leidos[mensajes.length -1 - i]=mensajes[i].isSet(Flags.Flag.SEEN); 
            //contenidosMail[mensajes.length -1 - i]= obtenerContenidoMensaje(mensajes[i]);
        }        
    }

    public void retrocederPagina(){
        if (numPagina>0) 
            numPagina--; 
    }
    public void pasarPagina(){
        if((numMailServidor-numMailVisualizar*(numPagina+1))>0)
            numPagina++;
    }
    
    
    public Mensaje[] encapsularMensajes() throws MessagingException, IOException{
        descargarMensajes();
        Mensaje[] mensajeList = new Mensaje[cabecerasMail.length];        
        for(int i=0;i<cabecerasMail.length;i++){
            if (leidos[i])
                mensajeList[i]= new Mensaje(cabecerasMail[i], "/imagenes/Coffee.png");
            else
                mensajeList[i]= new Mensaje(cabecerasMail[i], "/imagenes/Darkblue.png");  
            
        }
        return mensajeList;
    }
    public String getContenidoMail(int i) throws MessagingException, IOException{
        int indice = numMailServidor - (numPagina)*numMailVisualizar-i;
        Message mail = folder.getMessage(indice);
        return obtenerContenidoMensaje(mail);
    }

     private String obtenerContenidoMensaje(Part part) throws MessagingException, IOException {
        
        String contenido="";
        
        if (part.isMimeType("multipart/*")){
            Multipart multi;
            multi = (Multipart) part.getContent();
            for (int j = 0; j < multi.getCount(); j++){
                contenido +=obtenerContenidoMensaje(multi.getBodyPart(j));
            }
        }
        else{
            // Si es texto, se escribe el texto.
            if (part.isMimeType("text/plain")){
                contenido = (String)part.getContent();
            }
            if (part.isMimeType("image/*")){
                //guardarImagen(part);
                verImagen(part);
            }
        }
        return contenido;
     }

       
    private void verImagen(Part part) throws IOException, MessagingException {
        JFrame jFrame = new JFrame();
        ImageIcon icono = new ImageIcon(ImageIO.read(part.getInputStream()));
        JLabel jLabel = new JLabel(icono);
        jFrame.getContentPane().add(jLabel);
        jFrame.pack();        
        jFrame.setVisible(true);
    } 
    
}

